from functools import reduce

#一、map函数
#1、map()函数接收两个参数，一个是函数，一个是Iterable，map将传入的函数依次作用到序列的每个元素，并把结果作为新的Iterator返回。
#示例：将list1中的每个元素进行平方运算得到新的列表
nums1 = [1,2,3,4,5,6]

def square(x):
    return x * x

result1 = map(square,nums1)
list1 = list(result1)
print(list1)  #打印：[1, 4, 9, 16, 25, 36]


#2、map结合匿名函数使用
#结合匿名函数改进示例1如下：
nums2 = [1,2,3,4,5,6]
result2 = map(lambda x:x*x,nums2)
list2 = list(result2)
print(list2)  #打印：[1, 4, 9, 16, 25, 36]


#3、map函数接收多个序列参数
data_x = [1,2,3,4,5,6,7,8]
data_y =[1,2,3,4,5,6]
result3 = map(lambda x,y: x*2+y, data_x, data_y)
list3 = list(result3)
print(list3)   #打印：[3, 6, 9, 12, 15, 18]

#注意1：如果匿名函数参数为多个，map的列表参数也对应多个
#注意2：如果多个序列长度不同，以短序列长度为准决定操作次数

#二、reduce函数
#使用用reduce函数首先需要导入模块：“from functools import reduce”；
#reduce函数是把传入的函数作用在一个序列[x1, x2, x3, ...]上，这个函数必须接收两个参数，
#reduce会把操作结果继续和序列的下一个元素做累积计算，
#其效果就是：reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)；
#示例1：求序列和
result4 = reduce(lambda x,y:x+y,[1,2,3,4,5])
print(result4)  #打印：15

#示例2：将序列[1,3,5,7,9]变成整数13579
result5 = reduce(lambda x,y:x*10+y,[1,3,5,7])
print(result5)  #打印：1357

#示例3：假设Python没有提供int()函数，使用reduce函数实现一个把字符串转化为整数的函数
digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def searchNum(s):
    return digits[s]

def transStringToNum(s):
    return reduce(lambda x,y: x*10+y,map(searchNum,s))

result6 = transStringToNum("1234")
print(result6)  #打印：1234

#示例4：reduce函数的第三个参数，初始值
strs = ["Python","Html","OC"]
result7 = reduce(lambda x,y:x+y, strs, "Hello")
print(result7)  #打印：HelloPythonHtmlOC



#三、Filter函数
#与map()类似，filter()也接收一个函数和一个序列。
#和map()不同的是，filter()把传入的函数依次作用于每个元素，然后根据返回值是True还是False决定保留还是丢弃该元素。
#filte()中的匿名函数必须返回能够判别真假的值
#示例1：list中保留奇数，去除偶数
def is_odd(n):
    return n%2 == 1
result8 = filter(is_odd, [1,2,3,4,5,6])
print(list(result8))  #打印[1, 3, 5]



